package cn.mrcode.fd.utils.collections;

import java.util.HashSet;
import java.util.Set;

/**
 * set集合计算
 *
 * @author : zhuqiang
 * @version : V1.0
 * @date : 2015/12/30 23:22
 */
public final class SetUtils {
    /**
     * 交集，ab两个都有的
     * @param a
     * @param b
     * @param <T>
     * @return
     */
    public static <T> Set<T> intersection(Set<T> a,Set<T> b){
        HashSet<T> result = new HashSet<>();
        result.clear();
        result.addAll(a);
        result.retainAll(b);
        return result;
    }

    /**
     * 差集，属于a，并不属于b的
     * @param a
     * @param b
     * @param <T>
     * @return
     */
    public static <T> Set<T> difference(Set<T> a,Set<T> b){
        HashSet<T> result = new HashSet<>();
        result.clear();
        result.addAll(a);
        result.removeAll(b);
        return result;
    }

    /**
     * 并集 a + b 的和，由于set不是重复的所以和也是不重复的
     * @param a
     * @param b
     * @param <T>
     * @return
     */
    public static <T> Set<T> union(Set<T> a,Set<T> b){
        HashSet<T> result = new HashSet<>();
        result.clear();
        result.addAll(a);
        result.addAll(b);
        return result;
    }

    /**
     *  在两个集合中，old 和 new 集合中，差集 是 new集合中从old中删除掉的<br/>
     *  newSet 该方法返回的集合是，old中不存在的集合
     * @param <T>
     * @return
     */
    public static <T> Set<T> newSet (Set<T> oldSet,Set<T> newSet){
        HashSet<T> result = new HashSet<>();
        result.addAll(union(oldSet,newSet));
        result.removeAll(difference(oldSet,newSet));
        result.removeAll(intersection(oldSet,newSet));
        return result;
    }

    public static void main(String[] args) {
        Set<Integer> set1 = new HashSet<Integer>() {
            {
                add(1);
                add(3);
                add(5);
            }
        };

        Set<Integer> set2 = new HashSet<Integer>() {
            {
                add(1);
                add(2);
                add(3);
                add(4);
            }
        };

        Set<Integer> intersection = SetUtils.intersection(set1, set2);
        System.out.println("交集：" + intersection);
        Set<Integer> difference = SetUtils.difference(set1, set2);
        System.out.println("差集：" + difference);
        Set<Integer> union = SetUtils.union(set1, set2);
        System.out.println("并集：" + union);
        Set<Integer> newSet = SetUtils.newSet(set1,set2);
        System.out.println("新增：" + newSet);
    }
}
